﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Security.Permissions;
using System.Drawing.Design;
using System.Web.UI.HtmlControls;
using System.IO;
using System.ComponentModel.Design;

namespace jQuery.WebControls.ImageGallery
{
    /// <summary>
    /// Control que crea una galería de imágenes que se al hacer clic sobre ellas se muestran en grande
    /// con el componente jQuery Lightbox.
    /// </summary>
    [AspNetHostingPermission(SecurityAction.Demand,
        Level = AspNetHostingPermissionLevel.Minimal),
    AspNetHostingPermission(SecurityAction.InheritanceDemand,
        Level = AspNetHostingPermissionLevel.Minimal)]
    [DefaultProperty("Images")]
    [ToolboxData("<{0}:iGalleryControl runat=server></{0}:iGalleryControl>")]
    public class iGalleryControl : WebControl
    {
        private ClientScriptProxy scriptManager;
        private List<ThumbImage> imgs;
        private bool folderLoaded = false;
        private jQueryScriptManager jQueryMngr;

        public iGalleryControl():base()
        {
            imgs = new List<ThumbImage>();
        }
                
        protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);
            if (!Page.IsPostBack)
            {
                if (!DesignMode)
                    CheckQueryManager();
            }  
        }

        /// <summary>
        /// Sobrecarga del evento que se produce cuando se carga el control. Comprueba que los componentes jQuery y estilos
        /// existan en la página desde la que se carga el control iGalleryControl
        /// </summary>
        /// <param name="e">Variable EventArgs</param>
        protected override void OnLoad(EventArgs e)
        {            
            base.OnLoad(e);
                       
            EstiloImageGallery styleGallery = new EstiloImageGallery(Page, IdGalleryControlClient);
            styleGallery.ComprobarCSSenPagina();
            Style.Clear();
        }

        #region PROPIEDADES
        /// <summary>
        /// Carpeta donde están almacenadas las imágenes que se quieren listar.
        /// </summary>
        [Bindable(true)]
        [Category("Data")]
        [DefaultValue("imageField")]
        [Description("Dirección url local donde están almacenadas las imágenes")]
        [Localizable(true)]
        public string ImageFolder
        {
            get
            {
                String s = (String)ViewState["storage"];
                
                return ((s == null) ? String.Empty : s);
            }
            set
            {
                ViewState["storage"] = value;
            }
        }

        /// <summary>
        /// Colección de imagenes que se quieren listar. Si se ha añadido una carpeta de imágenes, la lista de imagenes
        /// se añade a las imagenes de la carpeta
        /// </summary>
        [Category("Data")]
        [Description("Lista de imágenes que se van a mostrar")]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
        Editor(typeof(CollectionEditor), typeof(UITypeEditor))]
        [PersistenceMode(PersistenceMode.InnerProperty)]    
        public List<ThumbImage> Images
        {
            get
            {               
                return imgs;
            }
            set
            {
                imgs = value;
            }
        }

        /// <summary> 
        /// Altura de las imágenes en la galería que ajusta conservando la proporción ancho-alto de las imágenes
        /// </summary>        
        [Category("Appearance")]
        [DefaultValue("72px")]
        [Localizable(false)]
        [Description("Altura de las imágenes en la galería")]
        public Unit ThumbnailHeight
        {
            get
            {
                if (ViewState["Hmin"] == null)
                    ViewState["Hmin"] = new Unit(72, UnitType.Pixel);
                return (Unit)ViewState["Hmin"];
            }
            set
            {
                ViewState["Hmin"] = value;
            }
        }
        #endregion

        #region PROPIEDADES PRIVADAS
        private string IdGalleryControlClient { get { return "m" + ClientID; } }
        #endregion
        /// <summary>
        /// Crea el árbol de controles hijos que va a tener el control iGalleryControl
        /// </summary>
        protected override void CreateChildControls()
        {
            setThumbnailProperties();
            if (!folderLoaded && !ImageFolder.Equals(string.Empty) && Page != null)
            {
                loadImagesFolder();
            }            
            string path = Page.Server.MapPath(ImageFolder);
            string myStyle = getStyle();
            HtmlGenericControl root = new HtmlGenericControl("div");
            HtmlGenericControl ul = new HtmlGenericControl("ul");
            HtmlGenericControl li;
            root.Attributes.Add("id", IdGalleryControlClient);
            if(myStyle != string.Empty)
                root.Attributes.Add("style", myStyle);
            if(CssClass != string.Empty)
                root.Attributes.Add("class", CssClass);
                            
            for (int i = 0; i < Images.Count; i++)
            {
                li = new HtmlGenericControl("li");                
                li.Controls.Add(Images[i]);
                ul.Controls.Add(li);
            }
            
            root.Controls.Add(ul);
            Controls.Add(root);
            //Controls.Add(getScript());
            ClientScriptProxy.RegisterStartupScript(Page, GetType(), "setIGallery", getScript().InnerText, true);
            //EnsureChildControls();
        }
        
        private HtmlGenericControl getScript()
        {
            HtmlGenericControl script = new HtmlGenericControl("script");
            script.Attributes.Add("type", "text/javascript");
            script.InnerText = "$(function() { $('#" + IdGalleryControlClient + " a').lightBox(); });";            
            return script;
        }

        private void setThumbnailProperties()
        {
            for (int i = 0; i < Images.Count; i++)
            {
                Images[i].Height = ThumbnailHeight;                
            }
        }

        private void loadImagesFolder()
        {
            string path = Page.Server.MapPath(ImageFolder);
            if (Directory.Exists(path))
            {
                string[] imagesDirType;
                ThumbImage img;
                string searchPattern = "*.jpg;*.gif;*.png";
                string[] ext = searchPattern.Split(';');
                for (int j = 0; j < ext.Length; j++)
                {
                    imagesDirType = Directory.GetFiles(path, ext[j]);
                    for (int i = 0; i < imagesDirType.Length; i++)
                    {
                        img = new ThumbImage();
                        img.ImageUrl = String.Format("{0}/{1}", ImageFolder, imagesDirType[i].Substring(imagesDirType[i].LastIndexOf("\\") + 1));
                        img.Height = ThumbnailHeight;
                        img.AlternateText = img.ImageUrl;
                        imgs.Add(img);
                    }
                }
                folderLoaded = true;
            }
        }
        /// <summary>
        /// Devuelve una cadena de HTML que contiene los estilos del control
        /// <example>
        ///     width: 200px; height: 100px; font-size: 10px
        /// </example>
        /// </summary>
        /// <returns></returns>
        private string getStyle()
        {
            string style = string.Empty;
            if (!Height.IsEmpty)
                style += String.Format("height: {0}{1};", (Height.Value - 10), Height.Type.ToString());
            if (!Width.IsEmpty)
                style += String.Format("width: {0}{1};", (Width.Value - 10), Width.Type.ToString());
            if (!Font.Size.IsEmpty)
                style += String.Format("font-size: {0};", Font.Size.ToString());
            if (Font.Bold.Equals(true))
                style += String.Format("font-weight: bold;");
            if (Font.Italic.Equals(true))
                style += String.Format("font-style: italic;");
            if (!ForeColor.IsEmpty)
                style += String.Format("color: {0};", System.Drawing.ColorTranslator.ToHtml(ForeColor));
            
            return style;
        }

        private ClientScriptProxy ClientScriptProxy
        {
            get
            {
                if (scriptManager == null)
                {
                    scriptManager = ClientScriptProxy.Current;
                }
                return scriptManager;
            }
        }

        private jQueryScriptManager jQueryManager
        {
            get
            {
                if (jQueryMngr == null)
                    jQueryMngr = Common.Instance.Get_jQueryScriptManager(Page);
                return jQueryMngr;
            }
        }

        private void CheckQueryManager()
        {
            jQueryScriptManager aux = jQueryManager;
        }
    }
}
